iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
DevOps

建立應用程式 UI 自動化測試 - 以 Robot Framework 為例系列 第 2

[2] Robot Framework 初體驗 - 基礎概念及結構

  • 分享至 

  • xImage
  •  

什麼是 Robot Framework?

Robot Framework 是一個成熟且廣泛應用的"開源"自動化測試框架,其主要特點是基於關鍵字驅動(Keyword-Driven)的測試方法,意思是指通過關鍵字來描述測試用例。這使得測試用例具有高度可讀性,甚至非技術人員也能夠理解和編寫測試,撰寫起來相當的口語化。得益於關鍵字驅動的設計,測試人員可以像在撰寫測試計劃一樣,透過撰寫一步步的測試步驟,逐步完成自動化測試。同時,Robot Framework 擁有強大的社群支持,提供了許多實用的第三方庫,如 SeleniumLibrary, Browser 用於網頁測試、AppiumLibrary 用於移動應用測試等

官方 Github:https://github.com/robotframework/robotframework

優點

  1. 開源和跨平台:Robot Framework 是開源的,可以在多個平台上運行,包括 Windows、macOS 和 Linux。
  2. 關鍵字驅動:測試用例以關鍵字形式書寫,具備良好的可讀性和可維護性。
  3. 豐富的庫支持:提供了大量內建的測試庫,如 SeleniumLibrary, Browser 用於網頁測試,AppiumLibrary 用於移動應用測試等,並支持用戶自定義庫。
  4. 靈活的擴展性:用戶可以用 Python 或 Java 編寫自定義測試庫,並與現有庫集成。
  5. 報告和日誌:自動生成詳細的測試報告和日誌,幫助用戶快速定位和分析問題。

缺點

雖然 Robot Framework 有許多優點,但也存在一些缺點:

  • 執行速度慢:由於 Robot Framework 是基於 Python 的,再加上一層包裹,執行速度會比直接使用 Python 程式碼稍慢。
  • 學習成本高:對某些人來說,關鍵字驅動的語法相較於直接編寫程式碼可能需要更多學習成本;不過,這一點見仁見智,有些人認為這種模式更像撰寫測試計劃,易於理解。
  • 維護成本高:當測試案例超過上千條時,維護變得更具挑戰,需要依賴良好的框架設計來提升維護體驗。

接著我們來了解 Robot Framework 的語法吧!

Robot Framework 的語法結構

接下來,我們一起來了解 Robot Framework 的語法結構。你會發現,它與傳統的程式語言有所不同,沒有先寫 Class 再寫 Func 的流程,而是使用特有的格式來組織測試用例。這正是 Robot Framework 透過關鍵字驅動 (Keyword-Driven Testing) 完成自動化測試的方式。

當我們要撰寫一個 Robot Framework 測試時,會需要創建一個副檔名為 .robot 的檔案,像是 test.robot,而在每一個 .robot 檔案中,大致上可以分成四個區塊,如下方展示了一個以 Robot Framework 撰寫的測試範例:

*** Settings ***
Documentation    My First Robot Framework

*** Variables ***
${hello_world} =    Hello World

*** Test Cases ***
Test Case 001
    ${sum} =    Sum Two Number    num1=1    num2=2
    Should Be Equal As Integers    first=${sum}    second=${3}

Test Case 002
    ${sum} =    Sum Two Number    num1=3    num2=3
    Should Be Equal As Integers    first=${sum}    second=${5}
    
*** Keywords ***
Sum Two Number
    [Arguments]    ${num1}    ${num2}
    ${sum} =    Evaluate    ${num1}+${num2}
    RETURN    ${sum}

從上面的程式碼中,我們可以發現有四個特殊的區塊,分別由 *** 包圍。在 Robot Framework 中,這些區塊稱為 Test Data Sections,用來區分每個區塊的功能。以下是四個常見的區塊:

***Settings***

這個區塊主要用來做測試初始化相關的設定,如匯入測試需要使用到的 Libraries,或是定義測試案例的 Timeout、以及設定測試的 Setup 和 Teardown,透過下方的範例我們可以看見,我們先匯入了一個 AppiumLibrary 的第三方 Library,接著設定每隻 Test Case 的 Test Timeout 是 300 秒,意思是指當今天當前的測試案例執行時間超過 300 秒時,便會直接觸發 Fail 後執行下一隻 Case,Suite Setup 則是整個 Test Suite 開始時的前置作業,以及在 Suite Teardown 中執行 Close All Applications 作為測試的收尾。

*** Settings ***
Library      AppiumLibrary

Test Timeout    300s

Suite Setup       Set Appium Timeout    100s
Suite Teardown    Close All Applications

***Variables***

用來宣告測試需要的變數,變數的作用範圍僅限於當前檔案,而不是全域變數。Robot Framework 提供了多種變數類型,如 ${NAME} 用於一般變數,@{NAME} 用於 List 型態,&{NAME} 用於 Dict 型態,需要注意的是,一但我們定義了變數可以接受的型態,在後續的使用中便都會對這些參數的型態進行驗。

*** Variables ***
${hello_world}    Hello World
@{fruit}    apple    banana
&{stock}    tsmc=2330

***Test Cases***

這邊就是重點啦!我們會將我們的測試案例寫在這個,格式會是第一行是 test case 的名稱,這個名稱最後會呈現在報告上,接著縮排後就是我們的測試步驟,以下面的程式碼為例,在下面的案例中,我們創建了兩隻 Test Case,分別為 Test Case 001Test Case 002,測試的流程則是透過 Sum Two Number 將指定的兩個數相加,最後透過 Should Be Equal As Integers 來驗證結果是否正確:

*** Test Cases ***
Test Case 001
    ${sum} =    Sum Two Number    num1=1    num2=2
    Should Be Equal As Integers    first=${sum}    second=${3}

Test Case 002
    ${sum} =    Sum Two Number    num1=1    num2=2
    Should Be Equal As Integers    first=${sum}    second=${5}

***Keywords***

類似於 Python 的 Function,用於將常使用的步驟包裝成一個 Keyword,方便在不同測試案例間重複使用。

Sum Two Number
    [Arguments]    ${num1}    ${num2}
    ${sum} =    Evaluate    ${num1}+${num2}
    RETURN    ${sum}

眼尖的夥伴們可能會發現,變數和關鍵字之間總是有空格。沒錯,這是 Robot Framework 用來區分 Keyword 和不同參數的方式,通常使用兩個以上的空白或一個 Tab 來做區分。

# 2 個空白
Sum Two Number  num1=3  num2=3

# 1 個 tab
Sum Two Number    num1=3    num2=3

結語

如果大家已經有程式基礎的話,看到 Robot Framework 的寫法大概率會被噁心到哈哈,但是其實上手後會發現 Robot Framework 還是有他的優點的,尤其是龐大的社群撐起的第三方庫,完全就是站在巨人的肩膀上在做開發,通過這一章節,我們了解了 Robot Framework 的基本概念及其語法結構。接下來,我們將實際操作一個 Robot Framework 的測試,幫助大家更好地掌握這一強大的工具。


上一篇
[1] 前言與自動化測試的小簡介
下一篇
[3] Robot Framework 安裝及初體驗
系列文
建立應用程式 UI 自動化測試 - 以 Robot Framework 為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言